package views;

import java.awt.*;
import java.awt.event.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.swing.*;

import javax.swing.plaf.metal.*;

/**
 *
 * @author eagle_eye
 */
public class PrincipalFrame extends JFrame {

    private JMenuBar menuBar;
    private JDesktopPane desktop;
    JInternalFrame toolPalette;
    JCheckBoxMenuItem showToolPaletteMenuItem;
    private JMenu Estudiantes;
    private JMenu Profesores;
    private JMenu Usuarios;
    private JMenu Cursos;
    private JMenu Areas;
    private JMenu Aulas;
    private JMenu Matriculas;
    private JMenu Documentos;
    private JMenu Herramientas;
    private JMenu Ayuda;
//    private Image image;
    static final Integer DOCLAYER = new Integer(5);
    static final Integer TOOLLAYER = new Integer(6);
    static final Integer HELPLAYER = new Integer(7);
    static final String ABOUTMSG = "Sischool \n \nSistema de información desarrollado como proyecto final de la materia SFT II. \n \nUniversidad Nacional de colombia. \n Raúl Villabona Suárez\n *\n *\n *";

    /**
     * Constructor de la clase.
     */
    public PrincipalFrame() {
        super("SISTEMA DE CONTROL ACADÉMICO");
        final int inset = 50;
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(inset, inset, screenSize.width - inset * 2, screenSize.height - inset * 2);
        buildContent();
        buildMenus();
//        image = new ImageIcon(getClass().getResource("/resources/a.png")).getImage();
        this.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                quit();
            }
        });
        UIManager.addPropertyChangeListener(new UISwitchListener((JComponent) getRootPane()));
    }

    /**
     * Metodo que construye el contenido del JDesktopPane
     */
    protected void buildContent() {
        desktop = new JDesktopPane();
        getContentPane().add(desktop);
    }

    /**
     * Metodo que construye los menus de la barra.
     */
    protected void buildMenus() {
        menuBar = new JMenuBar();
        menuBar.setOpaque(true);
        Estudiantes = buildEstudiantesMenu();
        Profesores = builProfesoresMenu();
        Usuarios = builUsuariosMenu();
        Cursos = builCursosMenu();
        Areas = builAreasMenu();
        Aulas = builAulasMenu();
        Matriculas = builMatriculasMenu();
        Documentos = builDocumentosMenu();
        Herramientas = buildHerramientasMenu();
        Ayuda = buildAyudaMenu();

        menuBar.add(getEstudiantes());
        menuBar.add(getProfesores());
        menuBar.add(getUsuarios());
        menuBar.add(getCursos());
        menuBar.add(getAreas());
        menuBar.add(getAulas());
        menuBar.add(getMatriculas());
        menuBar.add(getDocumentos());
        menuBar.add(getHerramientas());
        menuBar.add(getAyuda());

        setJMenuBar(menuBar);
    }

    /**
     * Metodo que construye el Menu Estudiantes del Frame
     * @return JMenu menu
     */
    protected JMenu buildEstudiantesMenu() {
        JMenu menu = new JMenu("Estudiantes");

        JMenuItem estudiantesAdmin = new JMenuItem("Administrar Estudiantes");
        estudiantesAdmin.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openEstuWindow();
            }
        });

        menu.add(estudiantesAdmin);
        return menu;
    }

    /**
     * Metodo que construye el menu profesores
     * @return JMenu
     */
    protected JMenu builProfesoresMenu() {
        JMenu edit = new JMenu("Profesores");
        JMenuItem undo = new JMenuItem("Deshacer");
        JMenuItem copy = new JMenuItem("Copiar");
        JMenuItem cut = new JMenuItem("Cortar");
        JMenuItem paste = new JMenuItem("Pegar");
        JMenuItem prefs = new JMenuItem("Preferencias...");

        undo.setEnabled(false);
        copy.setEnabled(false);
        cut.setEnabled(false);
        paste.setEnabled(false);

        prefs.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openEstuWindow();
            }
        });

        edit.add(undo);
        edit.addSeparator();
        edit.add(cut);
        edit.add(copy);
        edit.add(paste);
        edit.addSeparator();
        edit.add(prefs);
        return edit;
    }

    /**
     * Metdo que despliega la ventana para administrar estudiantes
     */
    public void openEstuWindow() {
        JInternalFrame estW = new EstudiantesIFrame(this);
        desktop.add(estW, HELPLAYER);
        try {
            estW.setVisible(true);
            estW.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {
            System.out.println("Error al desplegar la ventana de estudiante.");
        }
    }

    /**
     * Metodo que construye el Usuario Menu
     * @return
     */
    protected JMenu builUsuariosMenu() {
        JMenu usuario = new JMenu("Usuarios");
        JMenuItem prefs = new JMenuItem("Preferencias...");
        prefs.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openEstuWindow();
            }
        });

        usuario.add(prefs);
        return usuario;
    }

    /**
     * Metodo que construye el Cursos Menu
     * @return JMenu
     */
    protected JMenu builCursosMenu() {
        JMenu usuario = new JMenu("Cursos");
        JMenuItem prefs = new JMenuItem("Preferencias...");
        prefs.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openEstuWindow();
            }
        });

        usuario.add(prefs);
        return usuario;
    }

    /**
     * Metodo que construye el Areas Menu
     * @return JMenu
     */
    protected JMenu builAreasMenu() {
        JMenu usuario = new JMenu("Areas y Asignaturas");
        JMenuItem prefs = new JMenuItem("Preferencias...");
        prefs.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openEstuWindow();
            }
        });

        usuario.add(prefs);
        return usuario;
    }

    /**
     * Metodo que construye el Aulas Menu
     * @return JMenu
     */
    protected JMenu builAulasMenu() {
        JMenu usuario = new JMenu("Aulas y Laboratorios");
        JMenuItem prefs = new JMenuItem("Preferencias...");
        prefs.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openEstuWindow();
            }
        });

        usuario.add(prefs);
        return usuario;
    }

    /**
     * Metodo que construye el Matriculas Menu
     * @return JMenu
     */
    protected JMenu builMatriculasMenu() {
        JMenu usuario = new JMenu("Matriculas");
        JMenuItem prefs = new JMenuItem("Preferencias...");
        prefs.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openEstuWindow();
            }
        });

        usuario.add(prefs);
        return usuario;
    }

    /**
     * Metodo que construye el Documentos Menu
     * @return JMenu
     */
    protected JMenu builDocumentosMenu() {
        JMenu usuario = new JMenu("Documentos");
        JMenuItem prefs = new JMenuItem("Preferencias...");
        prefs.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openEstuWindow();
            }
        });

        usuario.add(prefs);
        return usuario;
    }

    /**
     * Metodo que contruye el menu Herramientas
     * @return JMenu 
     */
    protected JMenu buildHerramientasMenu() {

        /**
         * Cargar los temas desde el archivo de temas
         */
        MetalTheme myTheme = null;
        try {
            FileInputStream istream = new FileInputStream("resources/MyTheme.theme");
            myTheme = new PropertiesThemes(istream);
        } catch (FileNotFoundException e) {
            System.out.println("Error al cargar el recurso: " + e.getMessage());
        }

        /**
         *  Construir un arreglo de temas
         */
        MetalTheme[] themes = {new OceanTheme(),
            new DefaultMetalTheme(),
            new GreenMetalTheme(),
            myTheme};

        JMenu tool = new JMenu("Herramientas");
        JMenu themeMenu = new TemaMenu("Temas", themes);
        JMenuItem abrirDoc = new JMenuItem("Abrir Documento");


        abrirDoc.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openDocument();
            }
        });

        tool.add(abrirDoc);
        tool.add(themeMenu);
        return tool;
    }

    /**
     * Metodo que construye el menu AyudaIFrame
     * @return
     */
    protected JMenu buildAyudaMenu() {
        JMenu help = new JMenu("?");
        JMenuItem about = new JMenuItem("Acerca de sischool...");
        JMenuItem openHelp = new JMenuItem("Manual de usuario");
        JMenuItem quit = new JMenuItem("Salir");

        about.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                showAboutBox();
            }
        });

        openHelp.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                openHelpWindow();
            }
        });

        quit.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                quit();
            }
        });

        help.add(about);
        help.add(openHelp);
        help.addSeparator();
        help.add(quit);

        return help;
    }

    /**
     * Metdo que implementa el listener de About us
     */
    public void showAboutBox() {
        JOptionPane.showMessageDialog(this, ABOUTMSG);
    }

    /**
     * Metdo que implemenat el listener de Help
     */
    public void openHelpWindow() {
        JInternalFrame help = new AyudaIFrame();
        desktop.add(help, HELPLAYER);
        try {
            help.setVisible(true);
            help.setSelected(true);
        } catch (java.beans.PropertyVetoException e2) {
        }
    }

    /**
     * Metodo que permite abrir un documento
     */
    public void openDocument() {
        JFileChooser chooser = new JFileChooser();
        chooser.showOpenDialog(this);
    }

    /**
     * Metodo necesario para fijar la imagen del JDesktopPane
     */
//    @Override
//    public void paint(Graphics g) {
//        if (image != null) {
//            g.drawImage(image, 0, 0, getWidth(), getHeight(),
//                    this);
//            super.paint(g);
//        }
//
//    }
    /**
     * Metodo general que cierra las distintas ventanas.
     */
    public void quit() {
        System.exit(0);
    }

    /**
     * @return JMenu  Estudiantes
     */
    public JMenu getEstudiantes() {
        return Estudiantes;
    }

    /**
     * @return JMenu Profesores
     */
    public JMenu getProfesores() {
        return Profesores;
    }

    /**
     * @return JMenu Usuarios
     */
    public JMenu getUsuarios() {
        return Usuarios;
    }

    /**
     * @return JMenu Cursos
     */
    public JMenu getCursos() {
        return Cursos;
    }

    /**
     * @return JMenu Areas
     */
    public JMenu getAreas() {
        return Areas;
    }

    /**
     * @return JMenu Aulas
     */
    public JMenu getAulas() {
        return Aulas;
    }

    /**
     * @return JMenu Matriculas
     */
    public JMenu getMatriculas() {
        return Matriculas;
    }

    /**
     * @return JMenu Documentos
     */
    public JMenu getDocumentos() {
        return Documentos;
    }

    /**
     * @return JMenu Herramientas
     */
    public JMenu getHerramientas() {
        return Herramientas;
    }

    /**
     * @return JMenu AyudaIFrame
     */
    public JMenu getAyuda() {
        return Ayuda;
    }
}


